Swift - Tuple

相比于 Objective-C ,Swift 提供了一种新的类型 Tuple , Tuple可以创建一组不同类型的集合。

例如需要返回一个 HTTP 状态信息 :

  • 状态码 : 200 ; 状态消息 : SUCCESS
  • 状态码 : 404 ; 状态消息 : File not found

定义一个 Tuple

定义一个 HTTP 状态消息

1
2
3
4
//: #### Define a tuple

let success = (200 ,"SUCCESS") //(.0 200, .1 "SUCCESS")
let fail = (404 ,"File not found") //(.0 404, .1 "File not found")

定义一个指定命名的Tuple

1
let userInfo = (name: "jianxiong", age: 22, email: "jianxiong1997@gmail.com")

定义好之后 ,就可以通过下面的方式访问 Tuple 中的数据成员

1
2
3
4
5
6
7
8
9
success.0           //200
success.1 //"SUCCESS"

fail.0 //404
fail.1 //"File not found"

userInfo.name //"jianxiong"
userInfo.age //22
userInfo.email //"jianxiong1997@gmail.com"

Tuple Decomposition

把一个 Tuple 的值 ,一一拆分到不同的变量上 ,叫做 Tuple Decomposition 。

1
2
3
4
//: #### Tuple Decomposition
let (successCode, successMessage) = success
print(successCode) //200
print(successMessage) //SUCCESS

这里使用success 构建了一个新的 Tuple ,因此修改 successCode 和 successMessage 都不会对原有的 success 产生影响

1
2
3
4
5
successCode = 201
successMessage = "Created"
print(successCode) //201
print(successMessage) //Created
print(success) //(200, "SUCCESS")

如果只是想要对应到 Tuple 中特定的成员 ,忽略其他成员 , 可以采用 _ 来表示忽略的成员 , 例如

1
2
let (_ ,errorMessage) = fail
print(errorMessage) //"File not found"

Tuple Type

每一个 Tuple 的类型 , 都是有 Tuple 中所有成员决定的 。 例如 success 的类型 就是 (Int ,String) 。 当我们需要用 Type annotation 定义一个 Tuple 时 , 我们可以这样写。这里不能通过指定命名来取值了

1
2
3
4
var airPodsInfo:(String ,Double ,String) = (name: "商品名称" ,money: 1168.8 ,mode: "A2031")
airPodsInfo.0 //"商品名称"
airPodsInfo.1 //1168.8
airPodsInfo.2 //A2031

Tuple comparison

当我们比较两个Tuple类型的变量时,要遵循下面的规则:

首先,只有元素个数相同的Tuple变量之间,才能进行比较。例如,下面的代码会引发编译错误:

1
2
3
4
let tuple1 = (1,2,3)
let tuple2 = (1,2)

tuple1 > tuple2 //Binary operator '>' cannot be applied to operands of type '(Int, Int, Int)' and '(Int, Int)'

从上面的结果就能看到,包含两个Int的Tuple不能和包含三个Int的Tuple进行比较。
其次,当Tuple中元素个数相同时,比较是按照Tuple中元素的位置从前向后依次进行的:

  • 如果Tuple中,相同位置的两个元素相等,则继续比较下一个位置的两个元素,并根据第一个同一位置不相等的两个元素的大小关系,确定两个Tuple变量的关系;
  • 如果两个Tuple中所有位置的元素都相等,则两个Tuple变量相等;
1
2
3
4
let tuple1 = (1,3)
let tuple2 = (1,2)

tuple1 > tuple2 //true

需要注意下 tuple 最多包含6个元素的Tuple变量进行比较,超过这个数量,Swift会报错

1
2
3
4
let tuple1 = (1,3,34,123,135,244,2)
let tuple2 = (1,2,21,421,123,232,4)

tuple1 > tuple2 //Binary operator '>' cannot be applied to two '(Int, Int, Int, Int, Int, Int, Int)' operands